
//  WBStatusListViewModel.swift
//  Weibo
//
//  Created by kobe on 2016/12/24.
//  Copyright © 2016年 kobe. All rights reserved.
//

import Foundation
import SDWebImage

fileprivate let maxPullupTimes = 3

class WBStatusListViewModel {
    //微博模型数组懒加载
    lazy var statusList = [WBStatusViewModel]()
    
    fileprivate var pullupErrorTimes = 0
    
    func loadStatus(pullup:Bool = false,completion:@escaping (_ isSuccess:Bool,_ hasMorePullup:Bool)->()) {
        
        
        //判断是否是上拉刷新 同事检查刷新错误
        if pullup && pullupErrorTimes > maxPullupTimes {
            completion(true,false)
            return
        }
        
        
        //取最新的微博
        let since_id = pullup ? 0 : (statusList.first?.status.id ?? 0)
        //取出最后一条微博
        let max_id = !pullup ? 0 : (statusList.last?.status.id ?? 0)
        
        WBNetworkManager.shared.statusList(sice_id: since_id,max_id: max_id) { (list, isSuccess) in
            
            
            //判断网络请求是否成功
            if !isSuccess {
                //直接回调返回
                completion(false, false)
                
                return
            }
            
            
            
            // 1.字典转模型
            var array = [WBStatusViewModel]()
            //遍历服务器返回的字典数组 字典转模型
            for dict in list ?? [] {
                //创建微博模型
                guard let model = WBStatus.yy_model(with:dict) else {
                    continue
                }
                
                //将视图model添加到数组
                array.append(WBStatusViewModel(model: model))
            }
            

            
            //2.拼接数据
            // 下拉刷新：讲结果数组拼接在数组前面
            if pullup {
                //上拉刷新
                self.statusList += array
            } else {
                self.statusList = array + self.statusList

            }
            
            //判断上拉刷新的数据量
            if pullup && array.count == 0 {
                self.pullupErrorTimes += 1
                
                completion(isSuccess,false)
                
            } else {
                
                self.cacheSingleImage(list: array, finish: completion)
                
                // 3.完成回调
//                completion(isSuccess,true)
            }
            
            
            
            
        }
    }
    
    
    /// 缓存本次下载微博数据数组中的单张图像
    ///
    /// - parameter list: 本次下载的视图模型数组
    fileprivate func cacheSingleImage(list:[WBStatusViewModel],finish:@escaping (_ isSuccess:Bool,_ hasMorePullup:Bool)->()) {
        
        //调度组
        let group = DispatchGroup()
        
        //记录数据长度
        var length = 0
        
        //遍历数组 查找微博数据中有单张图像的 进行缓存
        for vm in list {
            
            // 判断图像数量
            if vm.picURLs?.count != 1 {
                continue
            }
            
            //获取图像模型
            guard let pic = vm.picURLs?[0].thumbnail_pic,let url = URL(string: pic) else {
                continue
            }
//            print("------\(url)")
            
            // 下载图像
            // downloadimage 是 SDWebImgae的核心方法
            // 图像下载完成之后会自动保存在沙盒中 文件路径是url的md5
            // 如果沙盒中已经存在缓存的图像 后续使用SD通过URL 加载图像 都会加载本地沙盒的图像 不会发起网络请求，同时回调方法同样会调用
            
            // a.入组
            group.enter()
            
            
            
            
            SDWebImageManager.shared().downloadImage(with: url, options: [], progress: nil, completed: { (image, _, _, _, _) in
                
                // 将图像转换成二进制数据
                if let image = image,
                    let data = UIImagePNGRepresentation(image) {
                    
                    length += data.count
                    
                    //图像缓存成功  更新配图视图的大小
                    vm.updateSingleImage(image: image)
                }
                
                // b.出组  放在回调的最后一句
                group.leave()
                
                print(image)
            })
            
        }
        
        // c.监听调度组情况
        group.notify(queue: DispatchQueue.main) { 
            print("图像缓存完成 \(length / 1024)")
            
            //执行回调
            finish(true, true)
        }
        
        
    }
    
    
}
